// * Promise.all 并行执行多个promise，所有传入的promise都返回结果后，才返回新的最终promise结果（结果是一个数组），结果顺序与传入的promise顺序一致。
// * 如果任意一个 promise 被 reject（失败），由 Promise.all 返回的 promise 就会立即 reject，并且带有的就是这个 error。

let p1 = new Promise((resolve) => setTimeout(() => resolve(1), 1000))
let p2 = new Promise((resolve) => setTimeout(() => resolve(2), 1000))
let p3 = new Promise((resolve) => setTimeout(() => resolve(3), 1000))
// let p4 = new Promise((resolve) =>
// 	setTimeout(() => {
// 		throw new Error('error')
// 	}, 3000)
// )

Promise.all([p1, p2, p3 /*, p4*/])
	.then((res) => {
		console.log(res) // [1, 2, 3]
	})
	.catch((err) => {
		console.log(err.message) // error
	})

// **********************************************************************************************************************************

// * Promise.allSettled 即使其中一个promise被reject，也会继续执行后面的promise，并返回对应的结果（成功和失败的结果都会返回）。

// * 对成功的响应，结果数组对应元素的内容为 {status:"fulfilled", value:result}，
// * 对出现 error 的响应，结果数组对应元素的内容为 {status:"rejected", reason:error}。

let p5 = new Promise((resolve) => setTimeout(() => resolve(1), 1000))
let p6 = new Promise((_, reject) => setTimeout(() => reject(new Error('error')), 1000))

Promise.allSettled([p5, p6]).then(
	(res) =>
		// 遍历结果：
		res.forEach((item) => {
			if (item.status === 'fulfilled') console.log(item.value)
			if (item.status === 'rejected') console.log(item.reason.message)
		}) // 1 error
)

// **********************************************************************************************************************************

// * Promise.race 返回获取结果最快的promise，无论是成功的还是失败的。
let p7 = new Promise((resolve) => setTimeout(() => resolve(1), 2000))
let p8 = new Promise((_, reject) => setTimeout(() => reject(new Error('race-error')), 1000))
let p9 = new Promise((resolve) => setTimeout(() => resolve(3), 3000))

Promise.race([p7, p8, p9])
	.then((res) => console.log(res))
	.catch((err) => console.log(err.message)) // race-error（执行这个）

// **********************************************************************************************************************************

// * Promise.any 返回获取结果最快的且成功的promise。
// * 如果给出的 promise 都是 rejected，那么返回的 promise 会带有 AggregateError —— 一个特殊的 error 对象，在其 errors 属性中存储着所有 promise error。
let p10 = new Promise((resolve) => setTimeout(() => resolve('111'), 3000))
let p11 = new Promise((_, reject) => setTimeout(() => reject(new Error('any-error1')), 1000))
let p12 = new Promise((_, reject) => setTimeout(() => reject(new Error('any-error2')), 1000))
let p13 = new Promise((resolve) => setTimeout(() => resolve('222'), 2000))

// * 有成功的情况：
Promise.any([p10, p11, p12, p13])
	.then((res) => console.log(res)) // 222
	.catch((err) => console.log(err.message))

// * 全失败情况：
Promise.any([p11, p12])
	.then((res) => console.log(res))
	.catch((error) => {
		console.log(error.errors[0].message) // any-error1
		console.log(error.errors[1].message) // any-error2
	})

// **********************************************************************************************************************************

// * 很少需要使用 Promise.resolve 和 Promise.reject 方法，因为 async/await 语法。
// * Promise.resolve(value) 直接返回一个成功的 promise 对象。和 const p = new Promise((resolve) => resolve(value)) 完全相同。
// * Promise.reject(error) 直接返回一个失败的 promise 对象。和 const p = new Promise((_,reject) => reject(error)) 完全相同。
